import jsCookie from 'js-cookie'
import { xhrJsonRequest, xhrUploadFile, xhrDownloadFile, httpGetParamHandle } from '@/utils/request'
// import { threadSleep } from '@/utils/common'

// 后台服务域名
const baseAdminDomain = process.env.VUE_APP_BASE_API
// 文件服务域名
const fileServerDomain = process.env.VUE_APP_UPLOAD_FILE_API
// // 刷新token接口地址
// const refreshTokenUrl = process.env.VUE_APP_BASE_API + '/AppAdmin/SysLogin/RefreshToken'

// 调试模式
const debug = false

/**
 * Api请求处理 api调用、权限验证、获取接口信息 可刷新token登录状态 自动提示错误消息
 * @param {*} path 请求路径不包含域名
 * @param {*} data 请求参数如{id:1, name:'zhangsan'} 最常用的数据传输对象 get类型则处理成?id=1&name=zhangsan post类型则转换成json字符串上传同时可用urlParam
 * @param {*} method 请求方式GET POST…… 注意GET类型使用data传参数 非GET类型全部使用urlParam做url参数不可用data传url参数
 * @param {*} operation operation操作类型
 * 0执行json类型请求调用 默认
 * 1下载文件建议用get:data不可用urlParam
 * 2上传文件建议使用post:formData、urlParam不可用data传url参数
 * 3上传到文件服务
 * 4授权检查
 * 5获取api路径
 * 6获取api包含域名的路径
 * @param {*} otherParam 不常用参数如：{vue:this, loadingKey:'formLoading', urlParam:{}, formData:new FormData(), routerParam:[], upLoadProc:function(loaded, total, e)){} } 参数说明：
 * vue vue实例this；
 * loadingKey 加载key；
 * urlParam 非get请求传url参数如{id:1, name:'zhangsan'}处理成?id=1&name=zhangsan 一般用于提交数据或上传文件时body不方便传参数时使用此字段；
 * formData formData实例 new FormData() 然后使用append添加文件信息；
 * routerParam 路由参数 按顺序转换为 域名/arr[0]/arr[1]；
 * upLoadProc 上传进度处理方法回调 upLoadProc(loaded, total, e){}；
 */
export async function apiRequest(path, data = {}, method = 'GET', operation = 0, otherParam = {}) {
  // 初始化数据
  var header = { 'Authorization': 'Bearer ' + jsCookie.get('X-Token') }
  if (path.indexOf('http://') === 0 || path.indexOf('https://') === 0) {
    throw new Error('path不能包含域名:' + path)
  }
  if (!data) {
    data = {}
  }
  if (!otherParam) {
    otherParam = {}
  }
  if (!otherParam.urlParam) {
    otherParam.urlParam = {}
  }
  var url = baseAdminDomain + path
  if (otherParam.routerParam) {
    otherParam.routerParam.forEach(item => {
      url += '/' + item
    })
  }
  if (method !== 'GET') {
    url = url + httpGetParamHandle(otherParam.urlParam)
  }

  // 递归验证接口权限方法
  // const verifyApiAuth = modules => {
  //   for (let i = 0; i < modules.length; i++) {
  //     const m = modules[i]
  //     if (m && m.auth) {
  //       for (let j = 0; j < m.auth.length; j++) {
  //         if (m.auth[j] === path) {
  //           // if (debug) {
  //           //   console.log('验证权限成功：' + url)
  //           // }
  //           return true
  //         }
  //       }
  //     }
  //     if (m.children) {
  //       if (verifyApiAuth(m.children)) {
  //         return true
  //       }
  //     }
  //   }
  //   return false
  // }

  // 执行请求方法
  const fetchApi = async(xhrFunc) => {
    // 准备发送请求
    if (otherParam.vue && otherParam.loadingKey) {
      otherParam.vue[otherParam.loadingKey] = true
    }
    if (debug) {
      console.log('开始请求：' + url)
    }

    var resp = await xhrFunc()

    if (otherParam.vue && otherParam.loadingKey) {
      // eslint-disable-next-line require-atomic-updates
      otherParam.vue[otherParam.loadingKey] = false
    }
    return resp
  }
  // 执行对应操作
  switch (operation) {
    case 0:
      return fetchApi(() => xhrJsonRequest(url, data, method, header))
    case 1:
      // 下载文件
      return await fetchApi(() => xhrDownloadFile(url, data, method, header))
    case 2:
      // 上传文件到本站点
      return await fetchApi(() => xhrUploadFile(url, otherParam.formData, otherParam.urlParam, method, header))
    case 3:
      // 上传文件到文件服务
      return await fetchApi(() => xhrUploadFile(fileServerDomain + path, otherParam.formData, otherParam.urlParam, method, header, otherParam.upLoadProc))
      // case 4:
      // return verifyApiAuth(store.state.user.authInfo)
    case 5:
      return path
    case 6:
      return url

    default:
      throw new Error('请输入正确的operation参数')
  }
}

/**
 * 使用url下载文件方法 不支持传请求头 暂时不使用
 * @param {*} url
 * @param {*} data 是get参数如{id:1, name:''}
 * @param {*} vue vue实例this
 * @param {*} loadingKey 加载key
 */
export function downloadFile(url, data, vue, loadingKey) {
  let dataStr = ''
  if (data) {
    Object.keys(data).forEach(key => {
      dataStr += key + '=' + data[key] + '&'
    })
    if (dataStr !== '') {
      dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'))
      url = url + '?' + dataStr
    }
  }
  if (!vue) {
    alert('请传入vue实例this！')
  }
  if (vue && loadingKey) {
    vue[loadingKey] = true
  }
  window.location.href = url +
    '&token=' + vue.$store.state.user.token +
    '&refToken=' + vue.$store.state.user.refToken +
    '&uId=' + vue.$store.state.user.uId +
    '&domain=' + window.location.origin
  if (vue && loadingKey) {
    vue[loadingKey] = false
  }
}

// // 登陆 以下方法都是异步方法调用时前面带上await
// export const sysUserLogin = (data, vue, loadingKey, operation, urlParam) => apiRequest('/AppAdmin/SysLogin/Token', data, 'POST', vue, loadingKey, operation, urlParam)

// // 退出
// export const sysUserSignOut = (vue, loadingKey, operation, urlParam) => apiRequest('/AppAdmin/SysLogin/SignOut', null, 'GET', vue, loadingKey, operation, urlParam)
